/**
 * describe：程序由tpframe官方提供，仅限源码学习研究，程序将持续更新，最新程序动态请关注:https://www.tpframe.com
 * mobile/微信：15523362830
 * QQ：510974211
 */
import cache from './cache.js'
module.exports={
	tpfJump(config={}){
		let config_default = {url:"",animationType:"",animationDuration:300,delta:1,type:"navigateTo"};
		config = Object.assign(config_default,config);
		switch(config.type){
			/**
			 * 关闭当前页面，跳转到应用内的某个页面。
			 */
			case "redirectTo":
				uni.redirectTo({
					url:config.url
				});
				break;
			/**
			*  关闭所有页面，打开到应用内的某个页面。  如果跳转的页面路径是 tabBar 页面则不能带参数
			*/
			case "reLaunch":	
				uni.reLaunch({
					url:config.url
				});
				break;
			/**
			 * 跳转到 tabBar 页面，并关闭其他所有非 tabBar 页面。
			 */
			case "switchTab":
				uni.switchTab({
					url:config.url
				});
				break;
			case "navigateBack":
				config.animationType = config.animationType || "pop-out";
				uni.navigateBack({
					delta:config.delta,
					// #ifdef APP-NVUE
					animationType:config.animationType,
					animationDuration:config.animationDuration
					// #endif
				});
				break;
			default:
				config.animationType = config.animationType || "pop-in";
				uni.navigateTo({
					url:config.url,
					// #ifdef APP-NVUE
					animationType:config.animationType,
					animationDuration:config.animationDuration
					// #endif
				});
				break;
		}
	},
	tpfToast(config={}){
		let config_default = {title:"",icon:"none",image:"",mask:true,duration:1500,position:"center",type:"showToast"};
		config = Object.assign(config_default,config);
		switch(config.type){
			case "hideToast":
				uni.hideToast();
				break;
			case "showLoading":
				config.title = config.title || "加载中...";
				uni.showLoading({
					title:config.title,
					mask:config.mask
				});
				break;
			case "hideLoading":
				uni.hideLoading();
				break;
			default:
				uni.showToast({
					title:config.title,
					icon:config.icon,
					// #ifdef MP-WEIXIN || MP-BAIDU || H5 || APP-PLUS-NVUE
					image:config.image,
					// #endif
					mask:config.mask,
					duration:config.duration,
					// #ifdef APP-PLUS-NVUE
					position:config.position,
					// #endif
				});
				break;
		}
	},
	between(value, min, max){
		return Math.max(Math.min(value, max), min);
	},
	toPx(value) {
		const result = /(\d+\.?\d*)(\w+)/.exec(value);
		if ('rpx' === result[2].trim()) {
			return uni.getSystemInfoSync().screenWidth * Number(result[1]) / 750;
		} else if('px' === result[2].trim()) {
			return Number(result[1]);
		} else {
			throw new TypeError(`${value}单位格式不正确`);
		}
	},
	//复制到粘贴板
	setClipboardData(content){
		// #ifndef H5
		uni.setClipboardData({
		    data: content,
		    success: function () {
		        this.tpfToast({title:"复制成功"});
		    }
		});
		// #endif
		
		// #ifdef H5
		if (!document.queryCommandSupported('copy')) {
		    // 不支持
			this.tpfToast({title:"不支持的平台"});
		    return false;
		}
		let textarea = document.createElement("textarea");
		textarea.value = content;
		textarea.readOnly = "readOnly";
		document.body.appendChild(textarea);
		textarea.select();
		textarea.setSelectionRange(0, content.length); //核心
		let result = document.execCommand("copy"); // 执行浏览器复制命令
		textarea.remove();
		this.tpfToast({title:"复制成功"});
		// #endif
	},
	// #ifdef APP-NVUE
	getComponentRect(ref) {
		const dom = uni.requireNativePlugin('dom');
		return new Promise(function (resolve, reject) {
			dom.getComponentRect(ref, data => {
				resolve(data);
			})
		})
	},
	// #endif
	setCache(k, v, t){
		cache.set(k, v, t);
	},
	getCache(k, def){
		return cache.get(k, def);
	},
	removeCache(k){
		cache.remove(k);
	},
	clearCache(){
		cache.clear();
	},
	//深度克隆的实现
	checkedType(target) {
	   return Object.prototype.toString.call(target).slice(8, -1);
	},
	clone(target) {
	   let result, targetType = this.checkedType(target);
	   if (targetType === 'Object') {
			result = {};
	   } else if (targetType === 'Array') {
			result = []
	   } else {
			return target;
	   }
	   // 遍历目标数据
	   for (let i in target) {
			let value = target[i];
			// 判断目标结构里的每一项值是否存在对象/数组
			if (this.checkedType(value) === 'Object' || this.checkedType(value) === 'Array') {
				// 继续遍历获取到的value
				result[i] = this.clone(value);
			} else {
				result[i] = value;
			}
		}
	   return result;
	},
	depthClone(target){
		return this.checkedType(target) === 'Object' || this.checkedType(target) === 'Array' ? JSON.parse(JSON.stringify(target)):target;
	}
}